package org.TCC_NOVO.client.visual;

import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Position;
import com.gwtext.client.data.FieldDef;
import com.gwtext.client.data.IntegerFieldDef;
import com.gwtext.client.data.ObjectFieldDef;
import com.gwtext.client.data.Record;
import com.gwtext.client.data.RecordDef;
import com.gwtext.client.data.SimpleStore;
import com.gwtext.client.data.Store;
import com.gwtext.client.data.StringFieldDef;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.TabPanel;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.ComboBox;
import com.gwtext.client.widgets.form.DateField;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.TextArea;
import com.gwtext.client.widgets.form.TextField;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;
import com.gwtext.client.widgets.grid.event.GridCellListenerAdapter;
import com.gwtext.client.widgets.layout.ColumnLayout;
import com.gwtext.client.widgets.layout.ColumnLayoutData;
import com.gwtext.client.widgets.layout.FormLayout;
import java.util.ArrayList;
import java.util.List;
import org.TCC_NOVO.client.modelo.Atividade_Roteiro;
import org.TCC_NOVO.client.GWTServiceAsync;
import org.TCC_NOVO.client.componente.FrStoryBoards;
import org.TCC_NOVO.client.modelo.Roteiro;
import org.TCC_NOVO.client.modelo.Slide;
import org.TCC_NOVO.client.modelo.Usuario;

public class RoteirosForm extends Window{
    MatrizPanelWindow MatPanelWin;
    private final GWTServiceAsync controller;
    public int IDF_unidade;
    public int IDF_Usuario;

    Panel panelPrin;
    FormPanel formPanel;
    FrStoryBoards storyBoards;
    Record record;

    //Atividades
    TextField textTitulo;
    TextArea textDescricao;
    DateField dataEntrega;
    ComboBox CBResp;
    ComboBox CBSlide;
    GridPanel gridAtiv;
    Store storeAtiv;
    RecordDef recordDefAtiv;
    ArrayList<Atividade_Roteiro> itensRemovidosAtivRoteiro = new ArrayList<Atividade_Roteiro>();
    
    public RoteirosForm(MatrizPanelWindow matPanelWin, GWTServiceAsync controller, int IDF_usua, int IDF_unidade) {
        this.controller = controller;
        this.IDF_Usuario = IDF_usua;
        this.IDF_unidade = IDF_unidade;
        this.MatPanelWin = matPanelWin;
        this.init();
        this.setModal(true);
    }

    private void init(){
        panelPrin = getPanelCentral();
        this.add(panelPrin);
        this.setTitle("Cadastro de Roteiro");
        carregarGrids();
    }

    private void carregarGrids(){
        storeAtiv.removeAll();
        controller.RetornarDadosRoteiro(IDF_unidade, new CallBackRetRoteiros());
        CBSlide.setStore(storyBoards.getListaSlide());
    }

    private class CallBackRetRoteiros implements AsyncCallback<Roteiro> {
        @Override
	public void onFailure(Throwable e) {
		MessageBox.alert("Erro ao carregar dados... ", e.getMessage());
	}
        @Override
	public void onSuccess(Roteiro result) {
               CarregarDados(result);
        }
     }

    private void CarregarDados(Roteiro roteiro){
        for (int i = 0; i < roteiro.getArrayAtivRot().size(); ++i) {
            addRecordAtividade(roteiro.getArrayAtivRot().get(i));
        }
        for (int i = 0; i < roteiro.getArraySlideRot().size(); ++i) {
            storyBoards.addRecordSlide(roteiro.getArraySlideRot().get(i));
        }
    }

    private Roteiro getRoteiroForm(){
        Roteiro Rot = new Roteiro();
        Rot.setIDF_Usuario(IDF_Usuario);
        Rot.setIDF_Unidade(IDF_unidade);
        Rot.setArraySlideRot(storyBoards.getListaSlides());
        //Atividades Roteiro
        ArrayList<Atividade_Roteiro> arrayAtivRoteiro = new ArrayList<Atividade_Roteiro>();
        for (int i = 0; i < storeAtiv.getCount(); ++i) {
            Atividade_Roteiro atvRot = new Atividade_Roteiro();
            atvRot.setId(storeAtiv.getAt(i).getAsInteger("ID"));
            atvRot.setTitulo(storeAtiv.getAt(i).getAsString("titulo"));
            atvRot.setDescricao(storeAtiv.getAt(i).getAsString("descricao"));
            atvRot.setData_entrega(storeAtiv.getAt(i).getAsString("data_Entrega"));
            atvRot.setResponsavel(storeAtiv.getAt(i).getAsString("usuario"));
            atvRot.setStatus(storeAtiv.getAt(i).getAsString("status"));
            atvRot.setSlide((Slide)storeAtiv.getAt(i).getAsObject("slide"));
            //campos para controle
            atvRot.setIdf_responsavel(storeAtiv.getAt(i).getAsInteger("IDF_Resp"));
            atvRot.setData_entrega_formatada(storeAtiv.getAt(i).getAsString("data_Ent_Form"));

            arrayAtivRoteiro.add(atvRot);
        }
        Rot.setArrayAtivRot(arrayAtivRoteiro);
           
        return Rot;
    }

    
    private Panel getPanelCentral(){
        Panel panel = new Panel();
        panel.setBorder(false);
        panel.setPaddings(1);

        TabPanel tabPanelCadastros = new TabPanel();
        formPanel = new FormPanel();
        formPanel.setLabelAlign(Position.TOP);
        formPanel.setFrame(true);
        formPanel.setWidth(1000);

        storyBoards = new FrStoryBoards(controller);
        storyBoards.setSize(1000, 540);
        //htmlEditor.setHeight(200);
        tabPanelCadastros.add(storyBoards);

        //adiciona Tab Panel Atividades...
        Panel panelTarefas = getPanelTarefas();
        panelTarefas.setSize(730, 540);
        tabPanelCadastros.add(panelTarefas);

        formPanel.add(tabPanelCadastros);


        final AsyncCallback callbackRoteiro = new AsyncCallback() {
            @Override
            public void onSuccess(Object result) {
                //MessageBox.alert("Registro Gravado com Sucesso!");
            }
            @Override
            public void onFailure(Throwable caught) {
               MessageBox.alert("Erro ", caught.getMessage()); }
        };

        final Button save = new Button();
        save.setText(" Salvar");
        save.setIcon("Images/salvar.png");
        save.setTooltip("Salvar");
        save.addListener(new ButtonListenerAdapter(){
            @Override
            public void onClick(Button button, EventObject e){
                  Roteiro Rote = getRoteiroForm();

                 controller.AlterarDadosRoteiro(Rote, callbackRoteiro);
                 controller.ItensRemovidosRoteiro(itensRemovidosAtivRoteiro, storyBoards.getItensRemovidos(), callbackRoteiro);
                 hide();
            }
        });
        formPanel.addButton(save);

        final Button cancel = new Button();
        cancel.setText(" Cancelar");
        cancel.setIcon("Images/cancelar.png");
        cancel.setTooltip("Cancelar");
        cancel.addListener(new ButtonListenerAdapter(){
            public void onClick(Button button, EventObject e){
                MessageBox.confirm("Deseja realmente sair?", "Todos os dados não submetidos serão perdidos", new MessageBox.ConfirmCallback() {
                    @Override
                    public void execute(String btnID) {
                        if (btnID.equals("yes")){
                            hide();
                        }
                        throw new UnsupportedOperationException("Not supported yet.");
                    }
                });
            }
        });
        formPanel.addButton(cancel);

        panel.add(formPanel);
        return panel;
    }

    private Panel getPanelTarefas(){

        Panel panelObjetivos = new Panel();
        panelObjetivos.setLayout(new ColumnLayout());
        panelObjetivos.setBorder(false);
        panelObjetivos.setTitle("Tarefas");

        Panel ObjetTab = new Panel();
        ObjetTab.setFrame(true);
        ObjetTab.setLayout(new FormLayout());
        ObjetTab.setPaddings(10);
        ObjetTab.setHeight(540);

        textTitulo = new TextField("Título", "titulo");
        textTitulo.setWidth(210);
        ObjetTab.add(textTitulo);
        textDescricao = new TextArea("Descrição", "descricao");
        textDescricao.setSize(210, 100);
        ObjetTab.add(textDescricao);
        dataEntrega = new DateField("Data Entrega", "dataEntrega", 210);
        dataEntrega.setBlankText("Este campo é obrigatório");
        dataEntrega.setEmptyText("Data Entrega");
        dataEntrega.setFormat("d/m/y");
        ObjetTab.add(dataEntrega);

        int ID = 0;
        final Store storeResponsavel = new SimpleStore(ID, new String[]{"ID", "Usuario"}, getUsuarios());
        storeResponsavel.load();

        CBResp = new ComboBox();
        CBResp.setForceSelection(true);
        CBResp.setMinChars(1);
        CBResp.setFieldLabel("Responsável");
        CBResp.setStore(storeResponsavel);
        CBResp.setDisplayField("Usuario");
        CBResp.setValueField("ID");
        CBResp.setMode(ComboBox.LOCAL);
        CBResp.setTriggerAction(ComboBox.ALL);
        CBResp.setEmptyText("Selecione o Responsável");
        CBResp.setLoadingText("Searching...");
        CBResp.setTypeAhead(true);
        CBResp.setSelectOnFocus(true);
        CBResp.setWidth(210);
        CBResp.setHideTrigger(false);
        CBResp.setName("usuario");
        ObjetTab.add(CBResp);

        CBSlide = new ComboBox();
        CBSlide.setForceSelection(true);
        CBSlide.setMinChars(1);
        CBSlide.setFieldLabel("Slide");
        CBSlide.setDisplayField("slide");
        CBSlide.setValueField("id");
        CBSlide.setMode(ComboBox.LOCAL);
        CBSlide.setTriggerAction(ComboBox.ALL);
        CBSlide.setEmptyText("Selecione o Slide");
        CBSlide.setLoadingText("Searching...");
        CBSlide.setTypeAhead(true);
        CBSlide.setSelectOnFocus(true);
        CBSlide.setWidth(210);
        CBSlide.setHideTrigger(false);
        CBSlide.setName("slide");
        ObjetTab.add(CBSlide);

        final Button AdicionaObj = new Button();
        AdicionaObj.setText(" Salvar");
        AdicionaObj.setIcon("Images/adicionarGrid.png");
        AdicionaObj.setTooltip("Salva no grid as informações");
        AdicionaObj.addListener(new ButtonListenerAdapter(){
            public void onClick(Button button, EventObject e){
                if (textTitulo.getText().equals("") || dataEntrega.getText().equals("") || CBResp.getRawValue().equals("")){
                    MessageBox.alert("Título, Data Entrega e Responsável são obrigatórios!");
                }else{
                    Atividade_Roteiro ativRot = getAtividadeRoteiroForm();
                    //se não tiver nenhum item do grid selecionado então adiciona no grid
                    if (gridAtiv.getSelectionModel().getSelected() == null){
                        addRecordAtividade(ativRot);
                        LimparAtividadeRoteiro();
                    }else{//senão altera grid selecionado
                        gridAtiv.getSelectionModel().getSelected().set("titulo", ativRot.getTitulo());
                        gridAtiv.getSelectionModel().getSelected().set("descricao", ativRot.getDescricao());
                        gridAtiv.getSelectionModel().getSelected().set("dataEntrega", ativRot.getData_entrega());
                        gridAtiv.getSelectionModel().getSelected().set("usuario", ativRot.getResponsavel());
                        gridAtiv.getSelectionModel().getSelected().set("IDF_Resp", ativRot.getIdf_responsavel());
                        gridAtiv.getSelectionModel().getSelected().set("slide", ativRot.getSlide());
                        gridAtiv.getSelectionModel().getSelected().set("data_Ent_Form", ativRot.getData_entrega_formatada());
                        gridAtiv.getSelectionModel().deselectRange(0,50);
                        LimparAtividadeRoteiro();
                    }
                }
            }
        });

        final Button removerObj = new Button();
        removerObj.setText(" Remover");
        removerObj.setIcon("Images/removerGrid.png");
        removerObj.setTooltip("Remove do grid o item selecionado");
        removerObj.addListener(new ButtonListenerAdapter(){
            public void onClick(Button button, EventObject e){
                if (gridAtiv.getSelectionModel().getSelected() == null){
                    MessageBox.alert("Necessário Selecionar Algum Registro! ");
                }else {
                    MessageBox.confirm("Confirmação de Exclusão", "Deseja Realmente Remover o Registro?", new MessageBox.ConfirmCallback(){
                    public void execute(String btnID){
                        if (btnID.equals("yes")){
                            //Remoção do Registro no Cliente (Grid)...
                            removeAtividade();
                        }
                    }});
                }
            }
        });

        ObjetTab.addButton(AdicionaObj);
        ObjetTab.addButton(removerObj);
        panelObjetivos.add(ObjetTab, new ColumnLayoutData(0.25));

        recordDefAtiv = new RecordDef(new FieldDef[]{
            new IntegerFieldDef("ID"),
            new StringFieldDef("titulo"),
            new StringFieldDef("descricao"),
            new StringFieldDef("dataEntrega"),
            new StringFieldDef("usuario"),
            new StringFieldDef("status"),
            new IntegerFieldDef("IDF_Resp"),
            new StringFieldDef("data_Ent_Form"),
            new ObjectFieldDef("slide")
        });

        storeAtiv = new Store(recordDefAtiv);

        gridAtiv = new GridPanel();
        gridAtiv.setStore(storeAtiv);

        ColumnConfig[] columnsObj = new ColumnConfig[]{
            new ColumnConfig("Título", "titulo", 110, true),
            new ColumnConfig("Descrição", "descricao", 125, true),
            new ColumnConfig("Data Entrega", "dataEntrega", 100, true),
            new ColumnConfig("Responsável", "usuario", 115, true),
            new ColumnConfig("Status", "status", 115, true),
            //new ColumnConfig("IDF_Resp", "IDF_Resp", 110, true),
            //new ColumnConfig("Data Ent Form", "data_Ent_Form", 110, true),
        };

        ColumnModel columnModel = new ColumnModel(columnsObj);
        gridAtiv.setColumnModel(columnModel);
        gridAtiv.setFrame(true);
        gridAtiv.setStripeRows(true);
        gridAtiv.setSize(300, 540);
        gridAtiv.addGridCellListener(new GridCellListenerAdapter() {
            @Override
            public void onCellDblClick(GridPanel grid, int rowIndex, int colIndex, EventObject e) {
                textTitulo.setValue(grid.getSelectionModel().getSelected().getAsString("titulo"));
                textDescricao.setValue(grid.getSelectionModel().getSelected().getAsString("descricao"));
                CBResp.setRawValue(grid.getSelectionModel().getSelected().getAsString("usuario"));
                CBResp.setValue(grid.getSelectionModel().getSelected().getAsString("IDF_Resp"));
                CBSlide.setRawValue(grid.getSelectionModel().getSelected().getAsString("slide"));
                CBSlide.setValue(((Slide)grid.getSelectionModel().getSelected().getAsObject("slide")).getId()+"");

                /*ConvDate conDta = new ConvDate();
                String dia_Ini = grid.getSelectionModel().getSelected().getAsString("dataEntrega").substring(8,10).trim();
                String mes_Ini = grid.getSelectionModel().getSelected().getAsString("dataEntrega").substring(4,7);
                //String ano_Ini = grid.getSelectionModel().getSelected().getAsString("dataEntrega").substring(11,15);
                String ano_Ini = grid.getSelectionModel().getSelected().getAsString("dataEntrega").substring(28,32);*/
                //dataEntrega.setValue(conDta.RetorarDataFormatada("ddmmyyyy", dia_Ini, mes_Ini, ano_Ini, "/"));
                dataEntrega.setValue(grid.getSelectionModel().getSelected().getAsString("dataEntrega"));
            }
        });

        panelObjetivos.add(gridAtiv, new ColumnLayoutData(0.75));

        return panelObjetivos;
    }

    public void addRecordAtividade(Atividade_Roteiro AtivRot){
        Object[] rowData = new Object[]{
          AtivRot.getId(),
          AtivRot.getTitulo(),
          AtivRot.getDescricao(),
          AtivRot.getData_entrega(),
          AtivRot.getResponsavel(),
          AtivRot.getStatus(),
          AtivRot.getIdf_responsavel(),
          AtivRot.getData_entrega_formatada(),
          AtivRot.getSlide()
        };
        Record recordLoc = recordDefAtiv.createRecord(rowData);
        storeAtiv.add(recordLoc);
    }

    private void removeAtividade(){
        Atividade_Roteiro atvRot = new Atividade_Roteiro();
        atvRot.setId(gridAtiv.getSelectionModel().getSelected().getAsInteger("ID"));
        itensRemovidosAtivRoteiro.add(atvRot);
        storeAtiv.remove(gridAtiv.getSelectionModel().getSelected());
    }

    private Atividade_Roteiro getAtividadeRoteiroForm(){
        DateTimeFormat sdf = DateTimeFormat.getFormat("yyyy-MM-dd");

        Atividade_Roteiro ativRot = new Atividade_Roteiro();
        ativRot.setTitulo(textTitulo.getText());
        ativRot.setDescricao(textDescricao.getText());
        ativRot.setResponsavel(CBResp.getRawValue());
        if (gridAtiv.getSelectionModel().getSelected() == null)
            ativRot.setStatus("Aberta");
        else
            ativRot.setStatus(gridAtiv.getSelectionModel().getSelected().getAsString("status"));

        ativRot.setData_entrega(sdf.format(dataEntrega.getValue()));

        //campos para controle
        ativRot.setIdf_responsavel(Integer.parseInt(CBResp.getValue()));
        sdf = DateTimeFormat.getFormat("yyyy-MM-dd");

        ativRot.setData_entrega_formatada(sdf.format(dataEntrega.getValue()));
        ativRot.setSlide(((Slide)storyBoards.getListaSlide().getById(CBSlide.getValue()).getAsObject("slide")));
        return ativRot;
    }

    private void LimparAtividadeRoteiro(){
        textTitulo.setValue("");
        textDescricao.setValue("");
        dataEntrega.setValue("");
        CBResp.setRawValue("");
        CBResp.setValue("");
        CBSlide.setRawValue("");
        CBSlide.setValue("");
    }
    
    public void loadRecord(Roteiro rote){
        storyBoards.loadRecord(rote.getArraySlideRot());
        //preenche o grid com as atividades daquele roteiro
        for (int i = 0; i < rote.getArrayAtivRot().size(); ++i) {
            Atividade_Roteiro ativRot = rote.getArrayAtivRot().get(i);
            addRecordAtividade(ativRot);
        }
    }

    private String[][] getUsuarios() {
        List<Usuario> l = MatPanelWin.ArrayUsua;
        String[][] s = new String[l.size()][2];

        for (int x = 0; x < l.size(); x++) {
            s[x][0] = l.get(x).getId()+"";
            s[x][1] = l.get(x).getNick()+"";
        }
        return s;

    }

}
